/*给定一个整数数组 nums 和一个目标值 target，请你在该数组中找出和为目标值的那 两个 整数，并返回他们的数组下标。

你可以假设每种输入只会对应一个答案。但是，你不能重复利用这个数组中同样的元素。

示例:

给定 nums = [2, 7, 11, 15], target = 9

因为 nums[0] + nums[1] = 2 + 7 = 9
所以返回 [0, 1]*/

import java.util.*;

import com.sun.xml.internal.ws.api.ComponentFeature.Target;



class twoSum {
    /**
    * 暴力遍历法
    * 执行用时 : 66 ms,
    * 内存消耗 : 38.2 MB,
    * 时间复杂度：O(n^2)
    * 空间复杂度：O()
    */
    public static int[] BaoliTwoSum(int[] nums, int target) {
        int[] returnNum = new int[2];
        for(int i=0;i<nums.length;i++){
            for(int j=i+1;j<nums.length;j++){
                int sum = nums[i]+nums[j];
                if(sum == target) {
                    returnNum[0]=i;
                    returnNum[1]=j;
                }
            }
        }
        return returnNum;
    }
    /**
     * 
     */
    public static int[] HashTwoSum(int[] nums,int target){
        Map<Integer,Integer> tempMap = new HashMap<>();
        for(int i=0; i<nums.length;i++){
          tempMap.put(nums[i], i);
        }
        for(int i=0; i<nums.length;i++){
            int com = target - nums[i];
            //判断hashmap里是否有对应键值对 第二个判断条件不等于是为了排出俩个数相等 6-3=3
            if(tempMap.containsKey(com) && (tempMap.get(com) != i)){
                return new int[] {i,tempMap.get(com)};
            }
        }
        throw new IllegalArgumentException("No two sum solution");
    }
    public static void main(String[] args){
        int[] nums = {5,4,2};
        int target = 6;
        //int[] numss = twoSum(nums,target);
        int[] a = HashTwoSum(nums,target);
        System.out.print(a[0]);
        System.out.print(a[1]);
    }
}